home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / tnc_tnc1.arc / TNC1BOOT.ASM < prev    next >
Assembly Source File  |  1987-05-26  |  13KB  |  610 lines

  1.     title    "TNC1 BOOT MODULE"
  2.     nam    tncbug
  3.  
  4. **
  5. * Copyright 1987 by Marc Kaufman, WB6ECE
  6. *  All Rights Reserved.
  7. *
  8. * Permission is given for non-commercial use and distribution,
  9. *  provided that this notice is retained.
  10. **
  11.  
  12. * Boot and debug ROM module for the TAPR TNC1
  13. * Written by Marc Kaufman, WB6ECE
  14. *
  15. * Correction history:
  16. *
  17. *    3/87    WB6ECE    - Initial Release
  18.  
  19. * NOTE -
  20. *    It may seem to be overkill to have a debug program that is
  21. *    (possibly) bigger than the program it loads.  But a few well
  22. *    chosen features make it easier to bring software up.
  23.  
  24. * Based on Motorola's 'mikbug' programs, but entirely rewritten
  25. *  Commands (see documentation for full description)
  26. *
  27. *    G    Go to target program
  28. *    M or @    Memory examine/change
  29. *    P    Poke memory without readback
  30. *    S    Display contents of target stack
  31. *            CC A B DP X Y U PC S
  32. *    R or #    Register examine/change
  33. *    D    Dump 8 bytes of memory
  34. *    W    Watch memory location for changes
  35. *    L    Load a Program into RAM (S-record format)
  36.  
  37. * Hardware addresses
  38.  
  39. acia    equ    $2010        6551 UART
  40. acchar    equ    acia
  41. acstat    equ    acia+1
  42. accmnd    equ    acia+2
  43. acctrl    equ    acia+3
  44.  
  45. pia    equ    $2020        6520 parallel output
  46. pra    equ    pia        register A
  47. pcra    equ    pia+1        control A
  48. prb    equ    pia+2        register B
  49. pcrb    equ    pia+3        control B
  50.  
  51. via    equ    $2040        6522 timer chip
  52. vorb    equ    via        output register B
  53. vora    equ    via+15        output register A, no handshake
  54. vddrb    equ    via+2        data direction register B
  55. vddra    equ    via+3        data direction register A
  56. vacr    equ    via+11        auxiliary control register
  57. vpcr    equ    via+12        peripheral control register
  58. vifr    equ    via+13        interrupt flag register
  59. vier    equ    via+14        interrupt enable register
  60.  
  61. *    NOTE: this chip inverts Address and Data leads!! (both)
  62. hdlc    equ    $2800        WD 1933 HDLC chip
  63. hcr1    equ    hdlc+7        control register 1
  64. hcr2    equ    hdlc+6        control register 2
  65. hcr3    equ    hdlc+5        control register 3
  66. hrhr    equ    hdlc+4        receive holding register
  67. hthr    equ    hdlc+3        transmit holding register
  68. hir    equ    hdlc+3        interrupt register
  69. hsr    equ    hdlc+2        status register
  70.  
  71. ram    equ    $0000        bank 0 ram ($0000 - $1fff)
  72. ram1    equ    $4000        bank 1 ram ($4000 - $5fff)
  73. rom    equ    $e000        top rom    ($e000 - $ffff)
  74.  
  75. CR    equ    $0d        carriage return
  76. LF    equ    $0a        line feed
  77.  
  78. *
  79.     dsect
  80.     org    ram        data starts in low ram
  81.  
  82. * interrupt re-vector area: parallel to fff0-ffff
  83.  
  84. igo    rmb    2        0000 - program start point
  85. iswi3    rmb    2        0002
  86. iswi2    rmb    2        0004
  87. ifirq    rmb    2        0006
  88. iirq    rmb    2        0008
  89. iswi    rmb    2        000a
  90. inmi    rmb    2        000c - last vector used
  91. ireset    rmb    2        full reset
  92.  
  93. cksum    rmb    1        loader checksum
  94. bytect    rmb    1        loader byte count
  95. addr    rmb    2        loader address field
  96. echofl    rmb    1        flag to enable character echo (0 = off)
  97. svchr    rmb    1
  98. svchra    rmb    1
  99. svchrx    rmb    2
  100. oldval    rmb    4        for watching
  101. newval    rmb    4
  102. saves    rmb    2        saved stack pointer
  103.  
  104.     rmb    12        initial stack, big enough for irq push
  105. myistack equ    *
  106.  
  107.     rmb    50
  108. mystack    equ    *        stack space for debugger
  109.  
  110.     csect
  111.  
  112. * interrupt vector list
  113.     org    $fff2        interrupt vectors
  114.  
  115.     fdb    jswi3
  116.     fdb    jswi2
  117.     fdb    jfirq
  118.     fdb    jirq
  119.     fdb    jswi
  120.     fdb    jnmi
  121.     fdb    bugstart
  122.  
  123. * main code space
  124.     org    $f800        top 2K, so it fits into 2716
  125.  
  126. * just to get it over with, interrupt re-vectoring goes here
  127.  
  128. jswi3    jmp    [iswi3]
  129. jswi2    jmp    [iswi2]
  130. jfirq    jmp    [ifirq]
  131. jirq    jmp    [iirq]
  132. jswi    jmp    [iswi]
  133. jnmi    jmp    [inmi]
  134.  
  135. * Main startup of debug monitor - on reset
  136.  
  137. bugstart
  138.     orcc    #$50        turn off interrupts (FIRQ + IRQ)
  139.     clra
  140.     sta    <echofl        turn off uart echo
  141.     tfr    a,dp        clear base page register
  142.  
  143. * reset 6520
  144.     sta    pcra        disable pia-A
  145.     sta    pcrb        disable pia-B
  146.  
  147. * reset 6522
  148.     sta    vpcr        clear CA2 to reset HDLC chip
  149.     sta    vacr        reset 6522 timer and shift register
  150.     ldd    #$fff0
  151.     sta    vora        set A output bits to '1'
  152.     stb    vddra         turning off NOVROM access
  153.     ldd    #$ff3f
  154.     sta    vorb        set B output bits to '1'
  155.     stb    vddrb         driving NOVROM address to all 1's
  156.     lda    #$ce
  157.     sta    vpcr        reset 6522 control modes (CA2 = 1)
  158.     lda    #$7f
  159.     sta    vier        disable all 6522 interrupts
  160.     sta    vifr        clear all 6522 interrupts
  161.  
  162.     lds    #0
  163.     ldx    #bugcont    default return for interrupts
  164.     lda    #8        number of things to fill
  165. .initi    stx    0,s++
  166.     decb
  167.     bne    .initi
  168.     ldx    #bugstart    full reset
  169.     stx    <ireset
  170.     lds    #myistack    private stack
  171.  
  172.     lda    #14        9600 baud select for acia
  173.     bsr    areset        start at 9600 (hunt mode)
  174. .initb    jsr    arcv        read a character
  175.     cmpb    #CR        look for CR at 9600
  176.     beq    bugcont        OK as is (stay at 9600)
  177.     ldb    #12
  178.     cmpa    #$e6
  179.     beq    .bset        4800 baud
  180.     ldb    #10
  181.     cmpa    #$78
  182.     beq    .bset        2400 baud
  183.     ldb    #8
  184.     cmpa    #$80
  185.     beq    .bset        1200 baud
  186.     ldb    #6
  187.     tsta            (300 baud)
  188.     bne    .initb        none of the above, continue waiting
  189.  
  190. .bset    orb    #$10        8 bit word, 1 stop, internal clock
  191.     stb    acctrl
  192.     swi            get to bugcont via interrupt
  193.  
  194. * reentry point, does not reset acia speed or vectors
  195.  
  196. bugcont    orcc    #$50        turn off interrupts (FIRQ + IRQ)
  197.     clra
  198.     tfr    a,dp        clear base page register
  199.     sts    <saves        save user stack pointer
  200.  
  201. contrl    lds    #mystack
  202.     bsr    acrlf        send prompt (cr-lf->)
  203.     lda    #'>'
  204.     bsr    asend
  205.     lda    acchar        trash any character in the receiver
  206.     clr    <echofl        turn off echo
  207.  
  208. cnget    jsr    arcv        get command character
  209.     stb    <svchr        save it (upper case)
  210.     ldy    #ctable
  211. cloop    lda    0,y+
  212.     beq    cnget        not found, ignore
  213.     ldx    0,y++
  214.     cmpa    <svchr
  215.     bne    cloop
  216.     bsr    asend        echo command
  217.     bsr    outs        add space
  218.     sta    <echofl        turn on echo
  219.     jmp    0,x        execute command
  220.  
  221. ctable    fcb    'G'        command action table
  222.     fdb    go
  223.     fcb    'M'
  224.     fdb    change
  225.     fcb    '@'
  226.     fdb    change
  227.     fcb    'P'
  228.     fdb    poke
  229.     fcb    'S'
  230.     fdb    sregs
  231.     fcb    'R'
  232.     fdb    rregs
  233.     fcb    '#'
  234.     fdb    rregs
  235.     fcb    'D'
  236.     fdb    dump
  237.     fcb    'W'
  238.     fdb    watch
  239.     fcb    'L'
  240.     fdb    load
  241.     fcb    CR
  242.     fdb    contrl
  243.     fcb    0        end of table
  244. * ACIA routines
  245.  
  246. * ARESET - reset acia (interrupts off)
  247. *    enter - Speed code in A
  248. *
  249. areset    sta    acstat        Programmed reset
  250.     anda    #$0f        isolate speed code
  251.     ora    #$10        8 bit word, 1 stop, internal clock
  252.     sta    acctrl
  253.     lda    #$0b        no parity, enable xmt, rcv, no interrupt
  254.     sta    accmnd
  255.     rts
  256.  
  257. * ASEND - send one character to acia (busy wait)
  258. *    enter - character in A
  259. *
  260. asend    ldb    acstat
  261.     bitb    #$10
  262.     beq    asend        wait for previous character to clear
  263.     sta    acchar        send this one
  264.     rts
  265.  
  266. * ACRLF - print cr,lf
  267. *
  268. acrlf    lda    #CR        cr
  269.     bsr    asend
  270.     lda    #LF        lf
  271.     bra    asend
  272.  
  273. * PRINT - print a string
  274. *    entry - address of string in X
  275. *
  276. print    lda    0,x+        get next character
  277.     beq    .prix        done
  278.     bsr    asend
  279.     bra    print
  280. .prix    rts
  281.  
  282. * OUT2H - put out hex digit (2 output bytes)
  283. *    entry - address of byte in X
  284. *
  285. out2h    lda    0,x+
  286.     sta    <svchr
  287.     bsr    outhl        output left digit
  288.     lda    <svchr
  289.     bra    outrl        output right digit
  290.  
  291. *
  292. outhl    lsra            output left hex digit
  293.     lsra
  294.     lsra
  295.     lsra
  296. outrl    anda    #$f        output right hex digit
  297.     adda    #'0'
  298.     cmpa    #'9'
  299.     bls    asend        0-9
  300.     adda    #'A'-'9'-1
  301.     bra    asend        A-F
  302.  
  303. *
  304. out4hs    bsr    out2h        output 2 bytes plus space
  305. out2hs    bsr    out2h        output 1 byte plus space
  306. outs    lda    #' '
  307.     bra    asend
  308.  
  309. out8hs    bsr    o4h        output 4 bytes separated by spaces
  310. o4h    bsr    out2hs
  311.     bra    out2hs
  312.  
  313. echoa    bsr    acrlf        echo address
  314.     ldx    #addr
  315.     bsr    out4hs        print it
  316.     ldx    <addr        restore address to X
  317.     rts
  318.  
  319. * ARCV - wait for and read one character from acia
  320. *    exit - character in A (8 bits)
  321. *        character in B (masked to 7 bits and upper case)
  322. *
  323. arcv    ldb    acstat
  324.     bitb    #$08
  325.     beq    arcv        wait for character to arrive
  326.     lda    acchar
  327.     tab
  328.     andb    #$7f
  329.     cmpb    #'a'
  330.     blt    .arcve        not alphabetic
  331.     cmpb    #'z'
  332.     bgt    .arcve
  333.     subb    #'a'-'A'    convert to upper case
  334. .arcve    tst    <echofl        echo this character?
  335.     beq    .arcvx        no
  336.     std    <svchrx        yes, save character
  337.     tba
  338.     bsr    asend        echo upper case variant
  339.     ldd    <svchrx
  340. .arcvx    rts
  341.  
  342. * INHEX - read a single hex digit into B
  343. *
  344. inhex    bsr    arcv        get a character
  345. inhexa    subb    #'0'        enter here if character in B already
  346.     lbmi    contrl        error
  347.     cmpb    #9
  348.     ble    .in1hg        in decimal range, OK
  349.     cmpb    #'A'-'0'
  350.     lbmi    contrl        not A-F
  351.     cmpb    #'F'-'0'
  352.     lbgt    contrl
  353.     subb    #'A'-'9'-1
  354. .in1hg    rts
  355.  
  356. * BYTE - read a hex byte (two frames)
  357. *    exit with character in A, cksum updated
  358. *
  359. byte    bsr    inhex        get hex character
  360. byteb    aslb
  361.     aslb
  362.     aslb
  363.     aslb
  364.     stb    <svchr        save it
  365.     bsr    inhex
  366.     addb    <svchr
  367.     tba
  368.     addb    <cksum
  369.     stb    <cksum
  370.     rts
  371.  
  372. bytea    bsr    inhexa        have character already, enter late
  373.     bra    byteb
  374.  
  375. * GETA - read a hex address
  376. *    exit with address in 'addr' and X
  377. *
  378. geta    bsr    byte        read 2 frames
  379.     sta    <addr
  380.     bsr    byte
  381.     sta    <addr+1
  382.     ldx    <addr
  383.     rts
  384.  
  385. * G - go to program... via rti
  386. *
  387. go    lds    <saves        location of return stack
  388.     rti
  389.  
  390. * M - change memory (M AAAA DD NN)
  391. *
  392. change    bsr    geta        get starting address
  393.     bsr    outs
  394.     bra    .cha52
  395.  
  396. .cha51    bsr    echoa        echo address to examine
  397. .cha52    jsr    out2hs        print (old) data
  398.     stx    <addr        save next address
  399.     bsr    arcv        input one character
  400.     cmpb    #CR
  401.     beq    .cha51        CR, go to next address
  402.     bsr    bytea        input new data
  403.     sta    0,-x        change memory
  404.     cmpa    0,x
  405.     beq    .cha51        did store correctly
  406.  
  407.     lda    #'?'
  408.     jsr    asend        error in store, print value seen
  409.     jsr    out2hs
  410.     bra    .cha51        continue anyway
  411.  
  412. * P - poke memory (P AAAA NN)
  413. *
  414. poke    bsr    geta        get starting address
  415.     jsr    outs
  416.     bra    .pok5a
  417.  
  418. .pok51    jsr    echoa        echo address to poke
  419. .pok5a    jsr    arcv        input one character
  420.     cmpb    #CR
  421.     beq    .pok52        skip this address
  422.     bsr    bytea        input data to poke
  423.     sta    0,x        store it
  424. .pok52    inx
  425.     stx    <addr        next address
  426.     bra    .pok51        continue
  427.  
  428. * S - print registers from stack (CC A B DP X Y U PC S)
  429. *
  430. sregs    ldx    #srhead
  431.     jsr    print
  432.     ldx    <saves        saved stack pointer
  433.     jsr    out2hs        condition codes
  434.     jsr    out2hs        A
  435.     jsr    out2hs        B
  436.     jsr    out2hs        DP
  437.     jsr    out4hs        X
  438.     jsr    out4hs        Y
  439.     jsr    out4hs        U
  440.     jsr    out4hs        PC
  441.     ldx    #saves
  442.     jsr    out4hs        S
  443.     jmp    contrl
  444.  
  445. srhead    fcc    ' CC  A  B DP   X    Y    U   PC    S'
  446.     fcb    CR,LF
  447.     fcc,n    '    '
  448.  
  449. * R - (R r DD NN) examine and change individual stack registers
  450. *
  451. rregs    jsr    arcv        get register name
  452.     stb    <svchra
  453.     ldy    #rtable        look up register name and offset
  454. rloop    lda    0,y+        get register name
  455.     lbeq    contrl        not found
  456.     ldx    0,y++        offset and length
  457.     cmpa    <svchra
  458.     bne    rloop        not this one, keep looking
  459.     jsr    outs        add space after register name
  460.  
  461.     tfr    x,d        move offset to A, length to D
  462.     ldx    <saves        user stack pointer
  463.     leax    a,x        address of register value
  464.     tsta            special cases
  465.     bpl    rlmod
  466.     ldx    #saves        stack pointer case
  467.  
  468. rlmod    stx    <addr        save address of field
  469.     stb    <svchra        save length of field
  470.     bne    rlp4        print long field
  471.     jsr    out2hs
  472.     bra    rlp
  473. rlp4    jsr    out4hs
  474. rlp    ldx    <addr        saved address of field
  475.     jsr    byte        first byte of field
  476.     sta    0,x+
  477.     tst    <svchra        is this a long field
  478.     lbne    contrl        no
  479.     jsr    byte        modify second byte of field
  480.     sta    0,x
  481.     jmp    contrl
  482.  
  483. rtable    fcb    'C',0,0        condition codes
  484.     fcb    'A',1,0        A
  485.     fcb    'B',2,0        B
  486.     fcb    'D',1,2        D
  487.     fcb    'G',3,0        DP
  488.     fcb    'X',4,2        X
  489.     fcb    'Y',6,2        Y
  490.     fcb    'U',8,2        U
  491.     fcb    'P',10,2    PC
  492.     fcb    'S',-1,2    S
  493.     fcb    0        end of table
  494.  
  495. * D - dump 8 bytes of memory (D AAAA) (D) TO CONTINUE
  496. *
  497. dump    jsr    geta        get starting address
  498.     jsr    outs
  499.     bra    .dump1
  500.  
  501. .dlp    jsr    echoa
  502. .dump1    jsr    out8hs
  503.     stx    <addr        next address
  504.     jsr    arcv
  505.     cmpb    #'D'        do we continue
  506.     beq    .dlp        yes
  507.     jmp    contrl        no
  508.  
  509. * W - watch memory (W AAAA)
  510. *   it re-displays on changes.
  511. *   type hex to make changes:
  512. *   space + hex changes, "-" does not.
  513. *
  514. *   type CR to exit
  515. *
  516. watch    jsr    geta        watch address
  517. .w0    ldx    <addr
  518.     lda    0,x
  519.     coma
  520.     sta    <oldval        force print first time
  521.  
  522. .w1    ldx    <addr
  523.     ldd    0,x        get latest values
  524.     std    <newval
  525.     ldd    2,x
  526.     std    <newval+2
  527.  
  528.     ldd    <newval
  529.     cmpd    <oldval
  530.     bne    .wd        different
  531.     ldd    <newval+2
  532.     cmpd    <oldval+2
  533.     beq    .wa
  534.  
  535. .wd    jsr    acrlf        print new value
  536.     ldx    #newval
  537.     jsr    out8hs
  538.     ldd    <newval        now turn print off
  539.     std    <oldval
  540.     ldd    <newval+2
  541.     std    <oldval+2
  542.  
  543. .wa    ldb    acstat        check for character pending
  544.     bitb    #$08
  545.     beq    .w1        no
  546.     jsr    arcv        get character
  547.     ldx    <addr        re-establish X register
  548.     cmpa    #CR        CR
  549.     lbeq    contrl        exit now
  550.     bra    .wc1
  551.  
  552. .wc    inx
  553.     jsr    arcv
  554.     cmpa    #CR        CR
  555.     beq    .w0        end of mods
  556. .wc1    cmpa    #'-'        skip this byte?
  557.     beq    .wc        yes
  558.     cmpa    #' '
  559.     lbne    contrl        exit
  560.     jsr    byte        get a new byte
  561.     sta    0,x
  562.     bra    .wc
  563.  
  564. * L - load S-records
  565. *
  566. load    equ    *
  567.     clr    <echofl        turn off echo of load
  568. .load1    jsr    arcv
  569.     cmpb    #'S'
  570.     bne    .load1        wait for record start
  571.     jsr    arcv        get record type
  572.     pshs    a        save it
  573.     clr    <cksum
  574.     jsr    byte        read a hex byte
  575.     suba    #2
  576.     sta    <bytect        save record byte count
  577.     jsr    geta        get load address
  578.     puls    a        recover record type
  579.     cmpa    #'9'
  580.     beq    .load5        eof record, end of load
  581.     cmpa    #'1'
  582.     bne    .load1        not binary record, skip it
  583.  
  584. .load2    jsr    byte        read a byte
  585.     dec    <bytect
  586.     beq    .load3        if through with data
  587.     sta    0,x+
  588.     bra    .load2
  589.  
  590. .load3    inc    <cksum        check checksum
  591.     beq    .load1        cksum ok, get next line
  592. .load4    lda    #'?'        error response
  593.     jsr    asend
  594.     jmp    contrl
  595.  
  596. .load5    jsr    byte        check checksum
  597.     dec    <bytect
  598.     bne    .load4        error, should be 3 bytes only
  599.     inc    <cksum
  600.     bne    .load4        error, checksum fails
  601.     cmpx    #0
  602.     beq    .load6        no start address given, dont store
  603.     stx    <igo        start address from eof record
  604. .load6    ldx    <igo        starting address
  605.     ldy    <saves
  606.     stx    10,y        dump start address into PC field
  607.     jmp    contrl        done
  608.  
  609.     end    bugstart
  610.